package com.wr.bq07;


import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

// 阻塞队列
// 4组API
public class ArrayBlockingQueue07 {

    public static void main(String[] args) throws InterruptedException {
        test4();
    }

    /**
     * 抛出异常的api
     */
    public static void test1(){
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);  // 定义长度为3的队列

        queue.add("a");
        queue.add("b");
        queue.add("c");
        // queue.add("d"); 超出长度，抛出异常的添加方法

        // 检查当前队首元素
        System.out.println(queue.element());



        System.out.println(queue.remove());
        System.out.println(queue.remove());
        System.out.println(queue.remove());
        // System.out.println(queue.remove()); 队列元素为空 会报异常


        System.out.println(queue.element());  // 会报错，当前无元素
    }

    /**
     * 有返回值，不抛出异常
     */
    public static void test2(){
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

        // 添加
        System.out.println(queue.offer("a")); // true
        System.out.println(queue.offer("b")); // true
        System.out.println(queue.offer("c")); // true
        System.out.println(queue.offer("d")); // false  队列满了 返回false

        // 检查当前队首元素
        System.out.println(queue.peek());


        System.out.println(queue.poll()); // a
        System.out.println(queue.poll()); // b
        System.out.println(queue.poll()); // c
        System.out.println(queue.poll()); // null

        System.out.println(queue.peek()); // null
    }

    /**
     * 阻塞  等待（一直等待）
     */
    public static void test3() throws InterruptedException {
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

        queue.put("a");
        queue.put("b");
        queue.put("c");
        //  queue.put("d");  队列已满一直等待 程序不结束

        queue.take();
        queue.take();
        queue.take();
        // queue.take(); 没有元素，一直等待
    }


    /**
     * 阻塞  等待（设置时间）
     */
    public static void test4() throws InterruptedException {
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d",2, TimeUnit.SECONDS);  //  等待2秒，如果还是满的就放弃

        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll(2, TimeUnit.SECONDS)); // 等待2秒，如果还是没有元素就返回null
    }
}


